New Relic の AWS IntegrationとECS integration を有効化し、AWS Fargate のメトリクスを連携してみた
はじめに
New Relicでは、AWSなどのクラウドサービスのデータを収集・可視化し、パフォーマンスの向上、トラブルシューティングの迅速化、システム運用リソースやコストの最適化を図ることができるサービスです。
New Relic にAWSの各種メトリクスを取り込む手順は、2つありますので、それぞれ行います。
- AWS Integration の有効化
- CloudWatch メトリクスのデータを New Relic に連携します
- ECS Integration の有効化
- CloudWatch の標準メトリクスでは収集できないタスク・コンテナレベルのメトリクスをNew Relic に連携します
AWS Integration と ECS integrationは、コンテナアプリケーションの オブザーバビリティ実現手順で紹介されている以下の部分に当たります。
事前準備
- New Relicアカウントの作成
-
Fargateでタスク起動できるコンテナ
- 何でもよいですが、私は、今回Nginxを利用します
- パブリックサブネット上で、起動しています
AWS Integration の有効化
下記の記事通り行うと設定できます。
設定後、数分すると、AWSリソースのメトリクスがNew Relic上で見ることができます。
New Relic の[Infrastructure]からExplore your data.
をクリックすると、確認できます。
必要なメトリクスのみを送信する
AWSリソースのメトリクスが全て送信されるとコスト的に心配な方は、必要なメトリクスのみを送信する設定を行いましょう。
CloudWatch側で以下の設定をします。
- CloudWatchのコンソール画面から[メトリクス]→[ストリーム]に遷移し、New Relic用のメトリクスストリームをクリックします
- [編集]から、[名前空間を選択]から必要なサービスを選択します
- 今回は、
ECS
、ECR
、ECS/ContainerInsights
を選択しました
- 今回は、
- 選択したメトリクスのみがNew Relic上で見ることができました。
ECS Integration の有効化
有効化の方法は、複数ありますが、今回は、CloudFormation を使用してインストールします。
手順は、以下のドキュメントにも記載があります。
- このスタックをクリックし、デプロイします。
- パラメータの
LicenseKey
は、New RelicのAPI Key のうち、タイプがINGEST - LICENSE
の値です。
- パラメータの
- スタックは、3つ作成されます。作成されたリソースのうち、以下のARNをコピーしておきます。
- NewRelicECSTaskExecutionRole
- NewRelicLicenseKeySecret
- Nginxコンテナに対して、New Relicへ送信するコンテナをサイドカーとして追加するため、Nginx用のタスク定義を修正します。修正箇所は、3つです
executionRoleArn
- 先程作成したNewRelicECSTaskExecutionRoleのARNに変更します
- 後述するタスク定義には、
3.で作成されたタスク実行ロールのARN
と記載しています
containerDefinitions
- サイドカーとして、New Relicへ送信するコンテナを追加します
containerDefinitions
- New Relic のライセンスキーが格納されている Secret の NewRelicLicenseKeySecretを追加します。
- 後述するタスク定義には、
3. で作成されたしたシークレットのARN
と記載しています
- ECSのコンソールから、Nginx用のタスク定義を選択し、JSON を使用してリビジョンを作成をクリックし、タスク定義を修正します。
containerDefinitions
の追加する内容 (クリックすると展開します){ "image": "newrelic/infrastructure-bundle:1.5.0", "name": "newrelic-infra", "cpu": 256, "memoryReservation": 512, "secrets": [ { "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:<アカウントID>:secret:NewRelicLicenseKeySecret-cXt38OPRg7Ex-r4KcIv", "name": "NRIA_LICENSE_KEY" } ], "environment": [ { "name": "NRIA_OVERRIDE_HOST_ROOT", "value": "" }, { "name": "NRIA_IS_SECURE_FORWARD_ONLY", "value": "true" }, { "name": "FARGATE", "value": "true" }, { "name": "ENABLE_NRI_ECS", "value": "true" }, { "name": "NRIA_PASSTHROUGH_ENVIRONMENT", "value": "ECS_CONTAINER_METADATA_URI,ENABLE_NRI_ECS,FARGATE" }, { "name": "NRIA_CUSTOM_ATTRIBUTES", "value": "{\"nrDeployMethod\":\"downloadPage\"}" } ] }
Nginxのタスク定義 (修正前) (クリックすると展開します)
{ "family": "nginx", "containerDefinitions": [ { "name": "nginx", "image": "<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:dev", "cpu": 0, "portMappings": [ { "name": "nginx-80-tcp", "containerPort": 80, "hostPort": 80, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "environment": [], "environmentFiles": [], "mountPoints": [], "volumesFrom": [], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/nginx", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } } } ], "executionRoleArn": "arn:aws:iam::<アカウントID>:role/ecsTaskExecutionRole", "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512", "runtimePlatform": { "cpuArchitecture": "X86_64", "operatingSystemFamily": "LINUX" }, "tags": [ { "key": "ecs:taskDefinition:createdFrom", "value": "ecs-console-v2" } ] }
Nginxのタスク定義 (修正後) (クリックすると展開します)
{ "family": "nginx", "containerDefinitions": [ { "name": "nginx", "image": "<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:dev", "cpu": 0, "portMappings": [ { "name": "nginx-80-tcp", "containerPort": 80, "hostPort": 80, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "environment": [], "mountPoints": [], "volumesFrom": [], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/nginx", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } } }, { "name": "newrelic-infra", "image": "newrelic/infrastructure-bundle:1.5.0", "cpu": 256, "memoryReservation": 512, "portMappings": [], "essential": true, "environment": [ { "name": "ENABLE_NRI_ECS", "value": "true" }, { "name": "NRIA_CUSTOM_ATTRIBUTES", "value": "{\"nrDeployMethod\":\"downloadPage\"}" }, { "name": "NRIA_IS_SECURE_FORWARD_ONLY", "value": "true" }, { "name": "NRIA_PASSTHROUGH_ENVIRONMENT", "value": "ECS_CONTAINER_METADATA_URI,ENABLE_NRI_ECS,FARGATE" }, { "name": "FARGATE", "value": "true" }, { "name": "NRIA_OVERRIDE_HOST_ROOT", "value": "" } ], "mountPoints": [], "volumesFrom": [], "secrets": [ { "name": "NRIA_LICENSE_KEY", "valueFrom": "<3. で作成されたしたシークレットのARN>" } ] } ], "executionRoleArn": "<3. で作成されたIAMロールのARN>", "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512", "runtimePlatform": { "cpuArchitecture": "X86_64", "operatingSystemFamily": "LINUX" }, "tags": [ { "key": "ecs:taskDefinition:createdFrom", "value": "ecs-console-v2" } ] }
Nginxのタスク定義 (修正後)の69行目と74行目は、先程コピーしたARNを貼り付けます
- 上記の作成したタスク定義を使い、タスクを起動します。
問題なければ、コンテナの
nginx
とnewrelic-infra
がRUNNING になります。 - 数分すると、New Relicにメトリクスが送信されます。New Relic の[All Entities]から[ECS clusters]を選択し、
対象のコンテナ(nginx)
をクリックすると、確認できます。
最後に
New Relicと標準メトリクスや標準メトリクス以外の連携は、比較的簡単連携できました。
今後は、Application LogsなどもNew Relicに導入してみたいと思います。
ぜひ使ってみてください。